package com.example.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.concurrent.Phaser;

@Service
@Slf4j
public class PhaserExampleService {

    private final Phaser phaser = new Phaser(1); // 主线程注册到Phaser

    /**
     * 演示Phaser的用法，模拟多线程的分阶段执行
     */
    public void executeTasksWithPhaser() {
        log.info("主线程开始注册到Phaser");

        // 启动三个子线程，参与分阶段任务
        for (int i = 0; i < 3; i++) {
            phaser.register(); // 为每个线程注册一个新参与者
            new Thread(new Worker(i)).start();
        }

        // 主线程等待所有子线程完成第一阶段
        phaser.arriveAndAwaitAdvance();
        log.info("所有线程完成阶段 1");

        // 主线程等待所有子线程完成第二阶段
        phaser.arriveAndAwaitAdvance();
        log.info("所有线程完成阶段 2");

        // 终止Phaser
        phaser.arriveAndDeregister();
        log.info("主线程完成，Phaser终止");
    }

    /**
     * 内部类，表示一个工作线程，每个线程执行两个阶段的任务
     */
    private class Worker implements Runnable {
        private final int workerId;

        public Worker(int workerId) {
            this.workerId = workerId;
        }

        @Override
        public void run() {
            log.info("线程 {} 开始阶段 1", workerId);
            phaser.arriveAndAwaitAdvance(); // 第一阶段完成，等待其他线程
            log.info("线程 {} 开始阶段 2", workerId);
            phaser.arriveAndAwaitAdvance(); // 第二阶段完成，等待其他线程
            phaser.arriveAndDeregister(); // 任务完成，注销自己
            log.info("线程 {} 已注销", workerId);
        }
    }
}
